home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / win / pascal / dndlb.exe / STRINGS1.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-03-16  |  10.9 KB  |  438 lines

  1. {$D-,L-,Y-}
  2.  
  3. UNIT Strings1;
  4.  
  5. {  Description:
  6.  
  7.    A collection of useful PChar/STRING related functions for
  8.    safe string handling:
  9.  
  10.    FUNCTION StrCopyNL(Dest,Source: PChar) : PChar;
  11.  
  12.       Copies Source to Dest and then appends the #13#10 chars to the
  13.       end of the Dest.
  14.  
  15.    FUNCTION StrCatNL(Dest,Source: PChar): PChar;
  16.  
  17.       Appends Source to Dest and then appends the #13#10 chars to the
  18.       end of the Dest.
  19.  
  20.    FUNCTION StrBoolean(Dest: PChar; AValue: BOOLEAN;
  21.                        TrueStr,FalseStr: PChar) : PChar;
  22.  
  23.       Sets 'Dest' to be a copy of either the 'TrueStr' if AValue
  24.       os TRUE or 'FalseStr' if AValue is FALSE.
  25.  
  26.    FUNCTION SafeStrLen(Source: PChar) : WORD;
  27.  
  28.       A safe form of StrLen that returns NIL and #0 type PChars
  29.       as zero length.
  30.  
  31.    FUNCTION SafeStrIComp(S1,S2: PChar) : INTEGER;
  32.  
  33.       A safe form of StrIComp that handles NIL and #0 type
  34.       parameters.
  35.  
  36.    FUNCTION SafeStrCopy(Dest,Source: PChar) : PChar;
  37.  
  38.       A safe form of StrCopy that handles NIL and #0 type parameters.
  39.  
  40.    FUNCTION StrPadRight(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  41.  
  42.       Copies Source to Dest and pads Dest with #32 to force a
  43.       Dest string length of PadLength.
  44.  
  45.    FUNCTION StrPadLeft(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  46.  
  47.       Copies Source to Dest and pads Dest with #32 to force a
  48.       Dest string length of PadLength.
  49.  
  50.    FUNCTION StrPadCenter(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  51.  
  52.       Copies Source to Dest and pads Dest with #32 to force a
  53.       Dest string length of PadLength.
  54.  
  55.    FUNCTION StrJustify(Dest,Source : PChar;
  56.                        AJust       : WORD;
  57.                        ATextLen    : INTEGER) : PChar;
  58.  
  59.       Copies Source to Dest and justifies the text result.
  60.  
  61.    FUNCTION StrStrip(Dest,Source: PChar) : PChar;
  62.  
  63.       Copies a stripped version of Source to Dest. All leading and trailing
  64.       blanks are removed.
  65.  
  66.    FUNCTION SafeStrUpper(Source: PChar) : PChar;
  67.  
  68.       Converts Source to upper case.
  69.  
  70.    FUNCTION DoubleToStr(Dest: PChar;
  71.                         ANumber: DOUBLE;
  72.                         ADecPlaces: INTEGER) : PChar;
  73.  
  74.       Returns ANumber converted to a PChar string with decimal places.
  75.  
  76.    FUNCTION RealToStr(Dest: PChar; ANumber: REAL; ADecPlaces: INTEGER) : PChar;
  77.  
  78.       Returns ANumber converted to a PChar string with decimal places.
  79.  
  80.    FUNCTION WordToStr(Dest: PChar; AWord: WORD) : PChar;
  81.  
  82.       Returns AWord converted to a PChar string.
  83.  
  84.    FUNCTION IntegerToStr(Dest: PChar; AnInteger: INTEGER) : PChar;
  85.  
  86.       Returns AnInteger converted to a PChar string.
  87.  
  88.    FUNCTION LongIntToStr(Dest: PChar; ALongInt: LONGINT) : PChar;
  89.  
  90.       Returns ALongInt converted to a PChar string.
  91.  
  92.    FUNCTION StrPasPadRight(Source: PChar; Padlength: INTEGER) : STRING;
  93.  
  94.       Copies and returns the Source PChar as a STRING variable
  95.       right padded with spaces to the Padlength.
  96.  
  97. }
  98.  
  99. { :::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  100.  
  101. INTERFACE
  102.  
  103.    uses Strings,winTypes;
  104.  
  105. { :::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  106.  
  107. FUNCTION StrCopyNL(Dest,Source: PChar) : PChar;
  108. FUNCTION StrCatNL(Dest,Source: PChar): PChar;
  109.  
  110. FUNCTION StrBoolean(Dest: PChar; AValue: BOOLEAN;
  111.                     TrueStr,FalseStr: PChar) : PChar;
  112. FUNCTION SafeStrLen(Source: PChar) : WORD;
  113. FUNCTION SafeStrIComp(S1,S2: PChar) : INTEGER;
  114. FUNCTION SafeStrCopy(Dest,Source: PChar) : PChar;
  115. FUNCTION StrPadRight(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  116. FUNCTION StrPadLeft(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  117. FUNCTION StrPadCenter(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  118.  
  119. FUNCTION StrJustify(Dest,Source : PChar;
  120.                     AJust       : WORD;
  121.                     ATextLen    : INTEGER) : PChar;
  122.  
  123. FUNCTION StrStrip(Dest,Source: PChar) : PChar;
  124.  
  125. FUNCTION SafeStrUpper(Source: PChar) : PChar;
  126.  
  127. FUNCTION DoubleToStr(Dest: PChar;
  128.                      ANumber: DOUBLE;
  129.                      ADecPlaces: INTEGER) : PChar;
  130. FUNCTION RealToStr(Dest: PChar; ANumber: REAL; ADecPlaces: INTEGER) : PChar;
  131. FUNCTION WordToStr(Dest: PChar; AWord: WORD) : PChar;
  132. FUNCTION IntegerToStr(Dest: PChar; AnInteger: INTEGER) : PChar;
  133. FUNCTION LongIntToStr(Dest: PChar; ALongInt: LONGINT) : PChar;
  134.  
  135. FUNCTION StrPasPadRight(Source: PChar; Padlength: INTEGER) : STRING;
  136.  
  137. { :::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  138.  
  139. IMPLEMENTATION
  140.  
  141. { :::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  142.  
  143.  
  144. FUNCTION StrCopyNL(Dest,Source: PChar) : PChar;
  145. BEGIN
  146.    StrCopy(Dest,Source);
  147.    StrCat(Dest,#13#10);
  148.    StrCopyNL := Dest;
  149. END;
  150.  
  151. { ------------------------------------------------------------- }
  152.  
  153. FUNCTION StrCatNL(Dest,Source: PChar) : PChar;
  154. BEGIN
  155.    StrCat(Dest,Source);
  156.    StrCat(Dest,#13#10);
  157.    StrCatNL := Dest;
  158. END;
  159.  
  160. { ------------------------------------------------------------- }
  161.  
  162.  
  163. FUNCTION StrBoolean(Dest: PChar;
  164.                     AValue: BOOLEAN;
  165.                     TrueStr,FalseStr: PChar) : PChar;
  166. BEGIN
  167.    IF AValue THEN
  168.       StrCopy(Dest,TrueStr)
  169.    ELSE
  170.       StrCopy(Dest,FalseStr);
  171.    StrBoolean := Dest;
  172. END;
  173.  
  174. { ------------------------------------------------------------- }
  175.  
  176. FUNCTION SafeStrLen(Source: PChar) : WORD;
  177. BEGIN
  178.    IF (Source = NIL) OR (Source[0] = #0) THEN
  179.       SafeStrLen := 0
  180.    ELSE
  181.       SafeStrLen := StrLen(Source)
  182. END;
  183.  
  184. { ------------------------------------------------------------- }
  185.  
  186. FUNCTION StrPasPadRight(Source: PChar; Padlength: INTEGER) : STRING;
  187. VAR
  188.    AStr : STRING;
  189.    Long,idx : INTEGER;
  190. BEGIN
  191.    IF Source = NIL THEN
  192.    BEGIN
  193.       AStr := '';
  194.       Long := 0;
  195.    END
  196.    ELSE
  197.    BEGIN
  198.       AStr := StrPas(Source);
  199.       Long := StrLen(Source);
  200.    END;
  201.    IF Long > PadLength THEN
  202.       StrPasPadRight := COPY(AStr,1,PadLength)
  203.    ELSE
  204.    BEGIN
  205.       IF Long = PadLength THEN
  206.          StrPasPadRight := AStr
  207.       ELSE
  208.       BEGIN
  209.          FOR idx := 1 TO (PadLength-Long) DO
  210.             AStr := AStr + ' ';
  211.          StrPasPadRight := AStr;
  212.       END
  213.    END
  214. END;
  215.  
  216. { ------------------------------------------------------------- }
  217.  
  218. FUNCTION SafeStrIComp(S1,S2: PChar) : INTEGER;
  219. BEGIN
  220.    IF (S1=NIL) OR (S2=NIL) THEN
  221.    BEGIN
  222.       IF S1 < S2 THEN
  223.       BEGIN
  224.          IF StrLen(S2) = 0 THEN
  225.             SafeStrIComp := 0
  226.          ELSE
  227.             SafeStrIComp := -1;
  228.       END
  229.       ELSE
  230.       BEGIN
  231.          IF S1 = S2 THEN
  232.             SafeStrIComp := 0
  233.          ELSE
  234.          BEGIN
  235.             IF StrLen(S1) = 0 THEN
  236.                SafeStrIComp := 0
  237.             ELSE
  238.                SafeStrIComp := 1
  239.          END
  240.       END
  241.    END
  242.    ELSE
  243.       SafeStrIComp := StrIComp(S1,S2);
  244. END;
  245.  
  246. { ----------------------------------------- }
  247.  
  248. FUNCTION SafeStrCopy(Dest,Source: PChar) : PChar;
  249. BEGIN
  250.    IF Source = NIL THEN
  251.       StrCopy(Dest,#0)
  252.    ELSE
  253.    BEGIN
  254.       IF StrLen(Source) = 0 THEN
  255.          StrCopy(Dest,#0)
  256.       ELSE
  257.          StrCopy(Dest,Source);
  258.    END;
  259.    SafeStrCopy := Dest;
  260. END;
  261.  
  262. { ----------------------------------------- }
  263.  
  264. FUNCTION SafeStrUpper(Source: PChar) : PChar;
  265. BEGIN
  266.    IF SafeStrLen(Source) > 0 THEN
  267.       SafeStrUpper := StrUpper(Source)
  268.    ELSE
  269.       SafeStrUpper := Source;
  270. END;
  271.  
  272. { ----------------------------------------- }
  273.  
  274. FUNCTION StrPadRight(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  275. VAR
  276.    Long,C : INTEGER;
  277. BEGIN
  278.    Long := StrLen(Source);
  279.    IF Long >= PadLength THEN
  280.       StrCopy(Dest,Source)
  281.    ELSE
  282.    BEGIN
  283.       StrCopy(Dest,Source);
  284.       FOR C := 1 TO (PadLength-Long) DO
  285.          StrCat(Dest,' ');
  286.    END;
  287.    StrPadRight := Dest;
  288. END;
  289.  
  290. { -------------------------------------------- }
  291.  
  292. FUNCTION StrPadLeft(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  293. VAR
  294.    Long,C : INTEGER;
  295. BEGIN
  296.    Long := StrLen(Source);
  297.    IF Long >= PadLength THEN
  298.       StrLCopy(Dest,Source,PadLength)
  299.    ELSE
  300.    BEGIN
  301.       StrCopy(Dest,' ');
  302.       IF (Padlength-Long) > 1 THEN
  303.       BEGIN
  304.          FOR C := 2 TO (PadLength-Long) DO
  305.             StrCat(Dest,' ');
  306.       END;
  307.       StrCat(Dest,Source);
  308.    END;
  309.    StrPadLeft := Dest;
  310. END;
  311.  
  312. { -------------------------------------------- }
  313.  
  314. FUNCTION StrPadCenter(Dest,Source : PChar; PadLength : INTEGER) : PChar;
  315. VAR
  316.    m,Long,C : INTEGER;
  317. BEGIN
  318.    Long := StrLen(Source);
  319.    IF Long >= PadLength THEN
  320.       StrLCopy(Dest,Source,PadLength)
  321.    ELSE
  322.    BEGIN
  323.       m := (PadLength-Long) DIV 2;
  324.       IF M > 0 THEN
  325.       BEGIN
  326.          StrCopy(Dest,' ');
  327.          IF m > 1 THEN
  328.          BEGIN
  329.             FOR C := 2 TO m DO
  330.                StrCat(Dest,' ');
  331.          END
  332.       END;
  333.       StrCat(Dest,Source);
  334.    END;
  335.    StrPadCenter := Dest;
  336. END;
  337.  
  338. { -------------------------------------------- }
  339.  
  340. FUNCTION StrJustify(Dest,Source : PChar;
  341.                     AJust       : WORD;
  342.                     ATextLen    : INTEGER) : PChar;
  343. VAR
  344.    Long : INTEGER;
  345. BEGIN
  346.    Long := StrLen(Source);
  347.    IF Long > 0 THEN
  348.    BEGIN
  349.       CASE AJust OF
  350.          es_Left   : StrPadRight(Dest,Source,ATextLen);
  351.          es_Right  : StrPadLeft(Dest,Source,ATextLen);
  352.          es_Center : StrPadCenter(Dest,Source,ATextLen);
  353.       END
  354.    END;
  355.    StrJustify := Dest;
  356. END;
  357.  
  358. { ------------------------------------------------ }
  359.  
  360. FUNCTION StrStrip(Dest,Source: PChar) : PChar;
  361. VAR
  362.    S,E : INTEGER;
  363. BEGIN
  364.    S := 0;
  365.    E := SafeStrLen(Source)-1;
  366.    IF E > 0 THEN
  367.    BEGIN
  368.       WHILE Source[S] = ' ' DO
  369.          INC(S);
  370.       WHILE Source[E] = ' ' DO
  371.          DEC(E);
  372.       StrLCopy(Dest,@Source[S],E-S+1);
  373.    END;
  374.    StrStrip := Dest;
  375. END;
  376.  
  377. { ------------------------------------------------ }
  378.  
  379. FUNCTION RealToStr(Dest: PChar; ANumber: REAL; ADecPlaces: INTEGER) : PChar;
  380. VAR
  381.    AStr : ARRAY[0..80] OF CHAR;
  382. BEGIN
  383.    STR(ANumber:40:ADecPlaces,AStr);
  384.    StrStrip(Dest,AStr);
  385.    RealToStr := Dest;
  386. END;
  387.  
  388. { ------------------------------------------------ }
  389.  
  390. FUNCTION DoubleToStr(Dest       : PChar;
  391.                      ANumber    : DOUBLE;
  392.                      ADecPlaces : INTEGER) : PChar;
  393. VAR
  394.    AStr : ARRAY[0..80] OF CHAR;
  395. BEGIN
  396.    STR(ANumber:40:ADecPlaces,AStr);
  397.    StrStrip(Dest,AStr);
  398.    DoubleToStr := Dest;
  399. END;
  400.  
  401. { ---------------------------------------- }
  402.  
  403. FUNCTION WordToStr(Dest: PChar; AWord: WORD) : PChar;
  404. VAR
  405.    AStr : ARRAY[0..20] OF CHAR;
  406. BEGIN
  407.    Str(AWord,AStr);
  408.    StrCopy(Dest,AStr);
  409.    WordToStr := Dest;
  410. END;
  411.  
  412. { ---------------------------------------- }
  413.  
  414. FUNCTION IntegerToStr(Dest: PChar; AnInteger: INTEGER) : PChar;
  415. VAR
  416.    AStr : ARRAY[0..20] OF CHAR;
  417. BEGIN
  418.    STR(AnInteger,AStr);
  419.    SafeStrCopy(Dest,AStr);
  420.    IntegerToStr := Dest;
  421. END;
  422.  
  423. { ---------------------------------------- }
  424.  
  425. FUNCTION LongIntToStr(Dest: PChar; ALongInt: LONGINT) : PChar;
  426. VAR
  427.    AStr : ARRAY[0..20] OF CHAR;
  428. BEGIN
  429.    Str(ALongInt,AStr);
  430.    StrCopy(Dest,AStr);
  431.    LongIntToStr := Dest;
  432. END;
  433.  
  434. { :::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  435.  
  436. BEGIN
  437.  
  438. END.